#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "set_bits.h"

int main() {
  //char s[SET__SIZE];
  struct set s;
  struct set v;
  // Put all letters with even ASCII code in s
  set__empty(&s);
  int c;
  for (c = 32; c <= 255; c=c+2)
    set__add(&s, (char)c);

  // Prints the size of s
  printf("Size of s: %zu\n", set__size(&s));

  // Checks if character #120 is in s

  if (! set__find(&s, 120))
    printf("*** Error: #120 not found\n");

  //Début de la vérification des axiomes

  //Axiome 1 :
  printf("Axiome 1, set__size(set__empty(&v)) : %zu , attendu 0\n" , set__size(  set__empty(&v))) ;
	assert( !set__size(  set__empty(&v)));
  //Axiome 2:
  printf("Axiome 2, set__size( set__add(&v, 'a')) revoie :  %zu, attendu 1\n" , set__size( set__add(&v, 'a')));
	assert(set__size( set__add(&v, 'a')));
  //Axiome 3:
  printf("Axiome 3, set__size( set__add(&v, 'a')):  %zu, attendu 1 \n" ,   set__size( set__add(&v, 'a')));
	assert(set__size( set__add(&v, 'a')));
  //Axiome 4:
  printf("Axiome 4, set__is_empty(set__empty(&v)) renvoie %d, attendu 1\n", set__is_empty(set__empty(&v)) );
	assert(set__is_empty(set__empty(&v)) );
  //Axiome 5:
  printf("Axiome 5, set__is_empty(set__add(&v, 'a')) renvoie %d, attendu 0\n", set__is_empty(set__add(&v, 'a')));
	assert(!set__is_empty(set__add(&v, 'a')));
  //Axiome 6:
  printf("Axiome 6, set__find(set__empty(&v), 'a') renvoie %d, attendu 0\n", set__find(set__empty(&v), 'a') );
	assert(!set__find(set__empty(&v), 'a'));
  //Axiome 7:
  printf("Axiome 7, set__find(set__add(&v, 'a'), 'a') renvoie %d, attendu 1\n", set__find(set__add(&v, 'a'), 'a') );
	assert(set__find(set__add(&v, 'a'), 'a'));
  //Axiome 8:
  printf("Axiome 8, set__find(set__add(&v, 'b'), 'c') renvoie %d, attendu 0\n", set__find(set__add(&v, 'b'), 'c') );
	assert(!set__find(set__add(&v, 'b'), 'c') );
  printf("Axiome 8*, set__find(set__add(&v, 'c'), 'b') renvoie %d, attendu 1\n", set__find(set__add(&v, 'c'), 'b') );
	assert(set__find(set__add(&v, 'c'), 'b'));
  //Axiome 9:
  struct set vide;
  set__empty(&vide);
  printf("Axiome 9, compare (set__remove(set__empty(&v),'a' ), &vide) = %d, attendu 1 \n", compare (set__remove(set__empty(&v),'a' ), &vide));
	assert(compare (set__remove(set__empty(&v),'a' ), &vide));

  //Axiome 10:
  printf("Axiome 10, set__is_empty(set__remove(set__empty(&v),'a')) retourne %d, attendu: 1\n", set__is_empty(set__remove(set__empty(&v), 'a')));
	assert(set__is_empty(set__remove(set__empty(&v), 'a')));
  //Axiome 11:
  struct set vprime;
  set__empty(&vprime);
  set__copy(&v, &vprime);
  printf("Axiome 11, compare ( set__remove(set__add(&v, c), c) , &v) = %d, attendu 1 \n", compare (&vprime, set__remove(set__add(&v, 'z'), 'z')));


  //Axiome 12:
  set__empty(&v);
  set__empty(&vprime);
  set__remove(set__add(&v, 'a'), 'b') ;
  set__add(set__remove(&vprime, 'b'), 'a');
  printf("Axiome 12, compare ( &v, &vprime) = %d, attendu 1 \n", compare (&v, &vprime));




  struct set res;
  struct set sprime;
  set__empty(&s);
  set__empty(&sprime);
  set__empty(&vide);




  printf("Axiome 13: set__inter(set__empty, s) \t\t\t= ");
    set__display( set__inter( &vide, &s, &res ) );
    printf("\n    Doit etre set__empty \t\t\t\t= ");
    set__display(&vide);
    printf("\n\n");
  printf("Axiome 14: set__inter(set__add(s, c), s’) \t\t= ");
    set__display(set__inter( set__add(&s,'1') , &sprime, &res ));
    printf("\n    Si set__find(s’,c)=true\t\t\t\t[%s]", set__find(&sprime, '1')?"Vrai":"Faux");
    printf("\n    Doit etre set__add(set__inter(s, s’), c) \t\t= ");
    set__display(set__add( set__inter(&s,&sprime,&res),'1' ));
    printf("\n\n");
  printf("Axiome 15: set__inter(set__add(s, c), s’)  \t\t= ");
    set__display(set__inter( set__add(&s,'2'), &sprime, &res ));
    printf("\n    Si set__find(s’,c)=false  \t\t\t\t[%s]", (!set__find(&sprime, '1'))?"Vrai":"Faux");
    printf("\n    Doit etre set__inter(s, s’) \t\t\t= ");
    set__display(set__inter(&s,&sprime,&res));
    printf("\n\n");

  printf("Axiome 16: set__union( set_empty() , s) \t\t= ");
    set__display( set__union( &vide, &s, &res ) );
    printf("\n    doit etre s \t\t\t\t\t= ");
    set__display(&s);
    printf("\n\n");
  printf("Axiome 17: set__union(set__union(set__add(s,'0')) , s')\t= ");
    set__display( set__union( set__add(&s, '0') , &sprime, &res ) );
    printf("\n    doit etre set__add(set__union(s, s’), c) \t\t= ");
    set__display( set__add( set__union(&s,&sprime,&res),'0' ) );
    printf("\n\n");




  return EXIT_SUCCESS;
}
